4-6 16. 最接近的三数之和
Date:2022-04-06 08:38:22
题目:16. 最接近的三数之和 ( 中等😕 )
给你一个长度为 n
的整数数组 nums
和 一个目标值 target
。请你从 nums
中选出三个整数,使它们的和与 target
最接近。
返回这三个数的和。
假定每组输入只存在恰好一个解。
示例
示例1:
输入:nums = [-1,2,1,-4], target = 1
输出:2
解释:与 target 最接近的和是 2 (-1 + 2 + 1 = 2) 。
示例2:
输入:nums = [0,0,0], target = 1
输出:0
分析
排序+双指针
跟 15. 三数之和 类似
题解
排序+双指针
function threeSumClosest(nums: number[], target: number): number {
const len = nums.length
nums.sort((a, b) => a - b)
let ans = Infinity,
a = 0
while (a < len) {
while (a > 0 && nums[a] == nums[a - 1]) {
++a
}
let b = a + 1,
c = len - 1
while (b < c) {
const sum = nums[a] + nums[b] + nums[c]
if (sum === target) {
return target
}
const diff = Math.abs(sum - target) < Math.abs(ans - target)
ans = diff ? sum : ans
if (sum > target) {
--c
while (c < len - 1 && b < c && nums[c] == nums[c + 1]) {
--c
}
} else {
++b
while (b > a + 1 && b < c && nums[b] == nums[b - 1]) {
++b
}
}
}
++a
}
return ans
}
使用
function main() {
const nums = [-1, 2, 1, -4],
target = 1
console.log('[]:', threeSumClosest(nums, target))
}
main()
export {}